共计 2097 个字符,预计需要花费 6 分钟才能阅读完成。
$this self:: parent::
$this 是当前对象的引用,一般出现在方法里,用于获取类的成员属性,或执行类的成员方法。
self:: 是对本类的引用,用于获取当前类的静态成员属性或静态成员方法。
parent:: 是对父类的引用。用于调用父类的方法或属性。
类常量
使用 const 来定义类常量,使用 self:: 来调用类常量。
<?php
class A {
const YES = 1;
public function aa() {return self::YES;}
}
echo (new A)->aa(); //1
方法重写
子类可以重写父类的方法,但使用 final 声明的方法,将禁止在子类中重写父类方法。
抽象类
具有抽象方法的类为抽象类,抽象方法即为没有内容的空方法,要求子类进行完善内容,抽象类不能实例化,只能继承。
继承一个抽象类的时候,方法的可见性必须和抽象类中一样(或者更为宽松)。如果抽象类中某个抽象方法被声明为 protected,那么子类中实现的方法就应该声明为 protected 或者 public,而不能定义 private。
<?php
abstract class A {
// 强制要求子类定义这些方法
abstract protected function a1();
abstract protected function a2($aa);
// 普通方法(非抽象方法)public function print() {echo '不用强制定义该方法';}
}
class B extends A {protected function a1() {return 'a1 方法被调用';}
public function a2($aa) {echo " 调用 a1 方法,参数:{$aa},结果:{$this->a1()}";
}
}
$obj = new B;
$obj->print();
$obj->a2('666');
接口
接口是一种特殊的抽象类,而抽象类又是一种特殊的类,所以可以将接口看作是一种特殊的类。
PHP 只支持单继承,如果想实现多继承,就需要使用接口,通过关键字 interface 来声明接口。
<?php
interface I {
const NAME = '张三';
function fun();}
class A implements I {public function fun() {echo self::NAME;}
}
$obj = new A();
$obj->fun(); // 张三
Trait
PHP 是单继承的语言,无法同时从两个基类中继承属性和方法,为了解决这个问题,出现了 Trait,为 PHP 单继承而准备的一种代码复用机制。
Trait 和 Class 相似,但无法通过 trait 自身来实例化,在类中使用 use 关键字,声明要组合的 Trait 名称。
<?php
trait A {public function aa() {echo 'aa';}
}
trait B {public function bb() {echo 'bb';}
}
class C {
use A, B;
public function cc() {echo 'cc';}
}
$c = new C;
$c->aa(); //aa
$c->bb(); //bb
$c->cc(); //cc
解决冲突
<?php
trait T1 {public function fun() {echo __METHOD__;}
}
trait T2 {public function fun() {echo __METHOD__;}
}
class A {
use T1, T2 {
T1::fun insteadof T2;
T2::fun as fun2;
}
}
$obj = new A();
$obj->fun(); //T1::fun
$obj->fun2(); //T2::fun
T1::fun insteadof T2;
表示使用 T1::fun 方法替代 T2::fun 方法。
T2::fun as fun2;
将 T2::fun 别名为 T2::fun2。
魔术方法
构造 & 析构方法
构造方法__construct():在创建对象时自动执行,没有返回值,用于执行类的一些初始化工作,如可以在构造方法中传递参数,进行对象属性的初始化。
析构方法__destruct():当所有对象的引用被销毁时执行。
__set() 和__get()
这两个方法不是默认存在的,而是手工添加到类里面去的,像构造方法(__construct())一样,类里面添加了才会存在。
__get():这个方法用来获取私有成员属性值,当尝试读取一个不存在或不可访问的属性值时,PHP 会自动调用__get() 方法。
__set():这个方法用来为私有成员属性设置值,当给一个不存在或不可访问的属性赋值时,PHP 会自动调用__set 方法。
__isset() 和__unset()
当使用 isset() 或者 empty() 函数判断属性是否存在或者是否为空的时候会自动触发。
当使用 unset() 函数判断属性时,如果存在__unset() 方法将会执行。
__call() 和__callStatic()
__call() 用来监视一个对象中的其它方法。如果试着调用一个对象中不存在或被权限控制的方法,__call 方法将会被自动调用。
当调用的静态方法不存在或权限不足时,会自动调用__callStatic 方法。